//package common.aop;
//
//import cn.hutool.core.io.FileUtil;
//import cn.hutool.http.HttpUtil;
//import com.alibaba.fastjson.JSON;
//import com.yuntsg.nnsfcp.common.beans.ResultBean;
//import com.yuntsg.ruiijn.database.mapper.LogExceptionMapper;
//import common.exception.CheckException;
//import common.exception.NoPermissionException;
//import common.exception.UnloginException;
//import common.util.PDFMERGE;
//import common.util.StringUtil;
//import com.yuntsg.nnsfcp.common.utils.UserUtil;
//import common.util.VerifyUtil;
//import org.aspectj.lang.JoinPoint;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.Around;
//import org.aspectj.lang.annotation.Aspect;
//import org.aspectj.lang.annotation.Pointcut;
//import org.aspectj.lang.reflect.MethodSignature;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.core.DefaultParameterNameDiscoverer;
//import org.springframework.core.ParameterNameDiscoverer;
//import org.springframework.stereotype.Component;
//import org.springframework.web.context.request.RequestAttributes;
//import org.springframework.web.context.request.RequestContextHolder;
//
//import javax.servlet.http.HttpServletRequest;
//import java.lang.reflect.Method;
//import java.util.*;
//
//import static com.yuntsg.ruiijn.service.AsyncService.localDateFilePath;
//
//
///**
// * 处理和包装异常
// *
// * @time:2019年01月01日21:10:36
// */
//@Aspect
//@Component
////@Order(-99)
//@SuppressWarnings("ALL")
//public class ControllerAopMsg {
//
//
//    private static final Logger logger = LoggerFactory.getLogger(ControllerAopMsg.class);
//    @Value("${upload.path}")
//    public String uploadPath;
//    @Value("${unit.unitName}")
//    public String unitName;
//    @Autowired
//    private LogExceptionMapper exceptionMapper;
//    @Autowired
//    private UserUtil userUtil;
//
//    /**
//     * 获取IP
//     *
//     * @param request
//     * @return
//     */
//    public static String getClientIP(HttpServletRequest request) {
//        String clientIp = request.getHeader("X-Forwarded-For");
//        if (clientIp == null || clientIp.isEmpty() || "unknown".equalsIgnoreCase(clientIp)) {
//            clientIp = request.getHeader("Proxy-Client-IP");
//        }
//        if (clientIp == null || clientIp.isEmpty() || "unknown".equalsIgnoreCase(clientIp)) {
//            clientIp = request.getHeader("WL-Proxy-Client-IP");
//        }
//        if (clientIp == null || clientIp.isEmpty() || "unknown".equalsIgnoreCase(clientIp)) {
//            clientIp = request.getHeader("HTTP_CLIENT_IP");
//        }
//        if (clientIp == null || clientIp.isEmpty() || "unknown".equalsIgnoreCase(clientIp)) {
//            clientIp = request.getHeader("HTTP_X_FORWARDED_FOR");
//        }
//        if (clientIp == null || clientIp.isEmpty() || "unknown".equalsIgnoreCase(clientIp)) {
//            clientIp = request.getRemoteAddr();
//        }
//
//        // 对于多个IP的情况，取第一个
//        if (clientIp != null && clientIp.contains(",")) {
//            clientIp = clientIp.split(",")[0];
//        }
//
//        return clientIp;
//    }
//
//    @Pointcut("execution(* com.yuntsg.ruiijn.controller.user.UploadLocalFileController.upload_pdf_local(..))")
//    public void controllerMethod() {
//    }
//
//    @Around("controllerMethod()")
//    public Object handlerControllerMethod(ProceedingJoinPoint pjp) {
//
//        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
//        HttpServletRequest request = (HttpServletRequest) Objects.requireNonNull(requestAttributes)
//                .resolveReference(RequestAttributes.REFERENCE_REQUEST);
//        ResultBean<?> result = null;
//        // 从切面织入点处通过反射机制获取织入点处的方法
//        MethodSignature signature = (MethodSignature) pjp.getSignature();
//        try {
//
//            Method method = signature.getMethod();
//            Map<String, Object> map = convertMap(pjp, method);
//            String path = (String) map.get("path");
//            String content = (String) map.get("content");
//            Integer fileType = null;
//            if (StringUtil.isNotNull(map.get("fileType"))) {
//                String fileType2 = (String) map.get("fileType");
//                fileType = Integer.parseInt(fileType2);
//            }
//            if ((fileType != null && fileType == 2) || fileType != null && "2" == map.get("fileType")) {//PDF
//                System.out.println("多个PDF合并");
//                if (path.contains("#P#D#F#")) {
//                    String pdfPath = localDateFilePath() + "MERGE_" + System.currentTimeMillis() + ".PDF";
//                    String[] paths = path.split("#P#D#F#");
//                    List<String> strings = Arrays.asList(paths);
//                    List<String> list = new ArrayList<>();
//                    for (String string : strings) {
//                        string = string.replaceAll("\"", "").trim();
//                        list.add(uploadPath + string);
//                    }
//                    boolean succ = PDFMERGE.mergePdfFiles(list, uploadPath + pdfPath);
//                    if (succ) {
//                        path = pdfPath;
//                    }
//                }
//            }
//
//            if (fileType != null) {
//                if (fileType == 2 || fileType == 3) {//WORD 或者 PDF
//                    path = path.replaceAll("\"", "").trim();
//                    path = uploadPath + path;
//                    System.out.println("校验文件合法性" + path);
//                    HashMap<String, Object> paramMap = new HashMap<>();
//                    paramMap.put("file", FileUtil.file(path));
//                    paramMap.put("unitName", unitName);
//                    paramMap.put("content", content);
//                    /**
//                     * 增加上传人信息
//                     */
//                    try {
//                        String clientIP = getClientIP(request);
//                        paramMap.put("ip", clientIP);
////                        SysUser userName = userUtil.();
////                        paramMap.put("user", JSONObject.toJSONString(userName));
//                    } catch (Exception e) {
//                        e.printStackTrace(System.err);
//                    }
//
//                    if (VerifyUtil.isNewDao19Server()) {
//                        HttpUtil.post("http://localhost:9090/admin_message/check", paramMap);
//                    } else {
//                        HttpUtil.post("https://localagent.yuntsg.com/admin_message/check", paramMap);
//                    }
//
//                }
//            }
//
//
//            result = (ResultBean<?>) pjp.proceed();
//        } catch (Throwable e) {
//            result = handlerException(pjp, e);
//
//        }
//        return result;
//    }
//
//    private ResultBean<?> handlerException(ProceedingJoinPoint pjp, Throwable e) {
//        ResultBean<?> result = new ResultBean();
//        // 登陆异常 1
//        if (e instanceof UnloginException) {
//            result.setMsg("Unlogin");
//            result.setCode(ResultBean.NO_LOGIN);
//        }
//        // 没有权限 2
//        else if (e instanceof NoPermissionException) {
//            result.setMsg("NO PERMISSION: " + e.getMessage());
//            result.setCode(ResultBean.NO_PERMISSION);
//        }
//        // 已知异常 3
//        else if (e instanceof CheckException) {
//            result.setMsg(e.getLocalizedMessage());
//            result.setCode(ResultBean.CHECK_FAIL);
//        } else {
//            logger.error(pjp.getSignature() + " error ", e);
//            //TODO 未知的异常，应该格外注意，可以发送邮件通知等
//            result.setMsg(e.toString());
//            result.setCode(ResultBean.UNKNOWN_EXCEPTION);
//        }
//        return result;
//    }
//
//    /**
//     * 转换request 请求参数
//     *
//     * @param joinPoint
//     * @param method
//     * @return
//     */
//    private Map<String, Object> convertMap(JoinPoint joinPoint, Method method) {
//        // 参数值
//        Object[] args = joinPoint.getArgs();
//        ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer();
//        String[] parameterNames = parameterNameDiscoverer.getParameterNames(method);
//        Map<String, Object> paramMap = new HashMap<>();
//        for (int i = 0; i < Objects.requireNonNull(parameterNames).length; i++) {
//            if (args == null || args.length == 0) {
//                paramMap.put(parameterNames[i], "none");
//                continue;
//            }
//            String argsStr = "";
//            if (args[i] != null) {
//                argsStr = JSON.toJSONString(args[i]);
//            }
//            String param = "";
//            if (parameterNames[i] != null) {
//                param = parameterNames[i];
//            }
//
//            paramMap.put(param, argsStr);
//        }
//        return paramMap;
//    }
//
//    /**
//     * 转换异常信息为字符串
//     *
//     * @param exceptionName    异常名称
//     * @param exceptionMessage 异常信息
//     * @param elements         堆栈信息
//     */
//    private String stackTraceToString(String exceptionName, String exceptionMessage, StackTraceElement[] elements) {
//        StringBuffer stringBuffer = new StringBuffer();
//        for (StackTraceElement stet : elements) {
//            stringBuffer.append(stet + "\n");
//        }
//        return exceptionName + ":" + exceptionMessage + "\n\t" + stringBuffer.toString();
//    }
//}
